package com.mazaiting.redeye.utils

import android.content.Context
import com.mazaiting.redeye.base.Config
import com.tencent.cos.xml.BuildConfig
import com.tencent.cos.xml.CosXmlService
import com.tencent.cos.xml.CosXmlServiceConfig
import com.tencent.cos.xml.transfer.COSXMLDownloadTask
import com.tencent.cos.xml.transfer.COSXMLUploadTask
import com.tencent.cos.xml.transfer.TransferConfig
import com.tencent.cos.xml.transfer.TransferManager
import com.tencent.qcloud.core.auth.SessionCredentialProvider
import com.tencent.qcloud.core.http.HttpRequest
import java.io.File
import java.net.URL

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-07-22
 * @description 腾讯云对象存储
 */
class CosUtil constructor(context: Context) {

    /**
     * Cos 服务配置
     */
    private var mTransferManager: TransferManager
    /**
     * 上下问
     */
    private val mContext = context

    companion object {
        /** 存储桶名称 */
        const val REGION = "ap-chengdu"
        /** 存储桶名称 */
        const val BUCKET = "redeye-1256286377"
    }

    init {
        // 1. 初始化配置类 CosXmlServiceConfig
        val mServiceConfig =
            CosXmlServiceConfig.Builder()
                .setRegion(REGION)
                .isHttps(true)
                .setDebuggable(BuildConfig.DEBUG)
                .builder()
        // 2. 初始化授权类 QCloudCredentialProvider
        val mCredentialProvider = SessionCredentialProvider(
            HttpRequest.Builder<String>()
                .url(URL(Config.URL_BASE + Config.URL_UPLOAD_GET_SIGN))
                .method("GET")
                .build()
        )
        // 3. 初始化 COS 服务类 CosXmlService
        val cosXmlService = CosXmlService(context, mServiceConfig, mCredentialProvider)
        // 4. 初始化 TransferConfig
        // 若有特殊要求，则可以如下进行初始化定制。如限定当对象 >= 2M 时，启用分片上传，且分片上传的分片大小为 1M, 当源对象大于 5M 时启用分片复制，且分片复制的大小为 5M。
        val transferConfig =
            TransferConfig.Builder()
                .setDividsionForCopy(5 * 1024 * 1024) // 是否启用分片复制的最小对象大小
                .setSliceSizeForCopy(5 * 1024 * 1024) //分片复制时的分片大小
                .setDivisionForUpload(2 * 1024 * 1024) // 是否启用分片上传的最小对象大小
                .setSliceSizeForUpload(1024 * 1024) //分片上传时的分片大小
                .build()
        // 5. 初始化 TransferManager
        mTransferManager = TransferManager(cosXmlService, transferConfig)
    }

    /**
     * 上传文件
     * @param cosPath 对象到 COS 上的绝对路径, 格式如 cosPath = "text.txt";
     * @param srcPath 本地文件绝对路径, 如 srcPath=Environment.getExternalStorageDirectory().getPath() + "/text.txt";
     * @param uploadId 若存在初始化分片上传的 UploadId，则赋值对应 uploadId 值用于续传，否则，赋值 null
     * @return 上传任务
     */
    fun upload(cosPath: String, srcPath: String, uploadId: String? = null): COSXMLUploadTask {
        // 上传对象
//        val cosXmlUploadTask = transferManager.upload(BUCKET, cosPath, srcPath, uploadId)
        return mTransferManager.upload(BUCKET, cosPath, srcPath, uploadId)
//        // 上传进度回调
//        cosXmlUploadTask.setCosXmlProgressListener { complete, target ->
//            run {
//                // 进度
//                val progress = 1.0f * complete / target * 100
//                // 打印
//                L.d(String.format("progress = %d%%", progress.toInt()))
//            }
//        }
//        // 设置返回结果回调
//        cosXmlUploadTask.setCosXmlResultListener(object : CosXmlResultListener {
//            override fun onSuccess(request: CosXmlRequest?, result: CosXmlResult?) {
//                val uploadTaskResult = result as COSXMLUploadTask.COSXMLUploadTaskResult
//                L.d("Success: " + uploadTaskResult.printResult())
//            }
//
//            override fun onFail(
//                request: CosXmlRequest?,
//                exception: CosXmlClientException?,
//                serviceException: CosXmlServiceException?
//            ) {
//                val msg = exception?.toString() ?: serviceException?.message
//                L.d("Failed: $msg")
//            }
//        })
    }

    /**
     * 下载
     * @param cosPath 对象在 COS 上的绝对路径,格式如 cosPath = "text.txt";
     * @param savedDirPath 对象下载到本地的文件夹路径
     * @param savedFileName 对象下载到本地的文件名, 若不填（null）,则与 cos 上的对象名一样
     */
    fun download(cosPath: String, savedDirPath: String, savedFileName: String? = null): COSXMLDownloadTask? {
        // 创建文件夹
        val file = File(savedDirPath)
        // 检测文件夹是否存在
        if (file.isDirectory) {
            file.mkdirs()
        } else {
            throw RuntimeException("请设置正确的文件路径")
        }
        // 下载对象
//        val cosxmlDownloadTask = mTransferManager.download(context, BUCKET, cosPath, savedDirPath, savedFileName);
        return mTransferManager.download(mContext, BUCKET, cosPath, savedDirPath, savedFileName)
//        // 设置下载进度回调
//        cosxmlDownloadTask.setCosXmlProgressListener { complete, target ->
//            run {
//                // 进度
//                val progress = 1.0f * complete / target * 100
//                // 打印
//                L.d(String.format("progress = %d%%", progress.toInt()))
//            }
//        }
//        // 设置返回结果回调
//        cosxmlDownloadTask.setCosXmlResultListener(object : CosXmlResultListener {
//
//            override fun onSuccess(request: CosXmlRequest?, result: CosXmlResult?) {
//                val uploadTaskResult = result as COSXMLUploadTask.COSXMLUploadTaskResult
//                L.d("Success: " + uploadTaskResult.printResult())
//            }
//
//            override fun onFail(
//                request: CosXmlRequest?,
//                exception: CosXmlClientException?,
//                serviceException: CosXmlServiceException?
//            ) {
//                val msg = exception?.toString() ?: serviceException?.message
//                L.d("Failed: $msg")
//            }
//
//        })
    }
}


















